import axios from 'axios'
import store from '@/store'
import router from '@/router'
import { Message } from 'element-ui'
import qs from 'qs'
axios.defaults.withCredentials = true
// 创建axios 实例
const service = axios.create({
  baseURL: '', // api的base_url
  timeout: 10000 * 10 // 请求超时时间
})

// request 拦截器
service.interceptors.request.use(
  config => {
    // 这里可以自定义一些config配置
    const { user } = store.state
    if (user && user.access_token) {
      config.headers.Authorization = user.access_token
    }
    return config
  },
  error => {
    // 处理一些请求出错的情况
    Promise.reject(error)
  }
)

type NewType = any

const redirectLogin = () =>
  router.push({
    path: '/login',
    query: {
      redirect: router.currentRoute.fullPath
    }
  })

const Refreshtoken = () =>
  axios({
    method: 'POST',
    url: '/front/user/refresh_token',
    headers: { 'content-type': 'application/x-www-form-urlencoded' },
    data: qs.stringify({ refreshtoken: store.state.user.refresh_token }) // axios 默认发送的是 application/json 格式的数据
  })

let isRefreshtoken = false
const isApiArray: any[] = []
// response 拦截器
service.interceptors.response.use(
  (response: NewType) => {
    const res = response.data
    return res
  },
  (error) => { // 超出2xx 都会走这
    if (error.response) { // 收到响应了
      const { status } = error.response
      if (status === 400) {
        Message.error('请求参数')
      } else if (status === 401) {
        if (!store.state.user) {
          redirectLogin()
          return Promise.reject(error)
        }
        if (!isRefreshtoken) {
          isRefreshtoken = true
          return Refreshtoken().then((data: any) => {
            if (data.data.success) {
              store.commit('setUser', data.data.content)
              isApiArray.forEach(cb => cb())
              isApiArray.splice(0)
              return service(error.config)
            }
            throw Error('刷新Token 异常')
          }).catch(error => {
            console.log(error)
            redirectLogin()
            return Promise.reject(error)
          }).finally(() => {
            isRefreshtoken = true
          })
        }

        return new Promise((resolve) => {
          isApiArray.push(() => {
            resolve(service(error.config))
          })
        })
      } else if (status === 403) {
        Message.error('没有权限')
      } else if (status === 404) {
        Message.error('请求资源不存在')
      } else if (status >= 500) {
        Message.error('服务端错误，请联系管理员')
      }
    } else if (error.request) { // 没有收到响应
      Message.error('请求超时')
    } else { // 设置请求的时候 触发了错误
      Message.error(`请求错误:${error.message}`)
    }
    return Promise.reject(error)
  }
)

export default service
